package com.kyh.util;

import javax.servlet.http.HttpServletRequest;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class IpUtil {
	public static void main(String[] args) {
		System.out.println(parseIp2Num("218.195.128.0"));
		System.out.println(getProvnameByIpFromTaobao("218.195.128.0"));
		System.out.println(parseIp2Str(3670245376L));
	}
	
	public static long parseIp2Num(String ip) {
		long ip1 = Long.parseLong(ip.substring(0, ip.indexOf(".")));
		ip = ip.substring(ip.indexOf(".") + 1, ip.length());
		long ip2 = Long.parseLong(ip.substring(0, ip.indexOf(".")));
		ip = ip.substring(ip.indexOf(".") + 1, ip.length());
		long ip3 = Long.parseLong(ip.substring(0, ip.indexOf(".")));
		ip = ip.substring(ip.indexOf(".") + 1, ip.length());
		long ip4 = Long.parseLong(ip);
		
		return ip1 * 256 *256 * 256 + ip2 * 256 * 256 + ip3 * 256 + ip4;
	}
	
	public static String parseIp2Str(long ipNum) {
		long ip1 = ipNum / (256L * 256 * 256);
		ipNum = ipNum - ip1 * 256 * 256 * 256;
		
		long ip2 = ipNum / (256L * 256);
		ipNum = ipNum - ip2 * 256 * 256;
		
		long ip3 = ipNum / 256;
		ipNum = ipNum - ip3 * 256;
		
		long ip4 = ipNum;
		
		return ip1 + "." + ip2 + "." + ip3 + "." + ip4;
	}
	
	public static String getProvnameByIpFromTaobao(String ip) {
		String provname = null;
		
//		String returnStr = HttpUtil.sendGet("http://ip.taobao.com/service/getIpInfo.php?ip=" + ip);
//		System.out.println("服务商返回的数据---" + returnStr);
//		JSONObject returnJO = JSON.parseObject(returnStr);
//		if ("0".equals(returnJO.getString("code"))) {
//			JSONObject dataJO = returnJO.getJSONObject("data");
//			provname = dataJO.getString("region");
//		}
		
		String returnStr = HttpUtil.sendGet("http://ip.ws.126.net/ipquery?ip=" + ip, "GBK");
		System.out.println("服务商返回的数据---" + returnStr);
		returnStr = returnStr.substring(returnStr.indexOf("{"));
		JSONObject returnJO = JSON.parseObject(returnStr);
		provname = returnJO.getString("province").substring(0, 2);
		
		return provname;
	}
	
	 /** 
     * 获取用户真实IP地址，不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址, 
*  
     * 可是，如果通过了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP值，究竟哪个才是真正的用户端的真实IP呢？ 
     * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。 
     *  
     * 如：X-Forwarded-For：192.168.1.110, 192.168.1.120, 192.168.1.130, 
     * 192.168.1.100 
     *  
     * 用户真实IP为： 192.168.1.110 
     *  
     * @param request 
     * @return 
     */  
    public static String getIpAddress(HttpServletRequest request) {  
        String ip = request.getHeader("x-forwarded-for");  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("Proxy-Client-IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("WL-Proxy-Client-IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_CLIENT_IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
        }  
        return ip;  
    }  
}
